import unittest
import transaction
from pyramid import testing


def _initTestingDB():
    from sqlalchemy import create_engine
    from alpha.modelos.models import (
        DBSession,
        Usuario,
        Rol,
        Base
        )
    engine = create_engine('sqlite:///:memory:')
    Base.metadata.create_all(engine)
    DBSession.configure(bind=engine)
    with transaction.manager:
        model = Usuario( 'carlos', 'carlos', 'carlos', 'carlos', 22, 22, 'aquinoqcd29@gmail.com')
        DBSession.add(model)
    return DBSession

class UsuariolTests(unittest.TestCase):

    def setUp(self):
        self.session = _initTestingDB()

    def tearDown(self):
        self.session.remove()

    def _getTargetClass(self):
        from alpha.modelos.models import Usuario
        return Usuario

    def _makeOne(self, nombreUsuario= 'nombreUsuario', password='password', nombre='nombre', apellido='apellido', telefono=22, nroDocumento=22, mail='mail@gmail.com'):
        return self._getTargetClass()(nombreUsuario, password, nombre, apellido, telefono, nroDocumento, mail)

    def test_constructor(self):
        instance = self._makeOne()
        self.assertEqual(instance.nombreUsuario, 'nombreUsuario')
        self.assertEqual(instance.nombre, 'nombre')
        self.assertEqual(instance.apellido, 'apellido')
        self.assertEqual(instance.telefono, 22)
        self.assertEqual(instance.nroDocumento, 22)
        self.assertEqual(instance.mail, 'mail@gmail.com')

class RollTests(unittest.TestCase):

    def setUp(self):
        self.session = _initTestingDB()

    def tearDown(self):
        self.session.remove()

    def _getTargetClass(self):
        from alpha.modelos.models import Rol
        return Rol

    def _makeOne(self, nombreRol= 'nombreRol', descripcion='descripcion'):
        return self._getTargetClass()(nombreRol, descripcion)

    def test_constructor(self):
        instance = self._makeOne()
        self.assertEqual(instance.nombreRol, 'nombreRol')

class ProyectolTests(unittest.TestCase):

    def setUp(self):
        self.session = _initTestingDB()

    def tearDown(self):
        self.session.remove()

    def _getTargetClass(self):
        from alpha.modelos.models import Proyecto
        return Proyecto

    def _makeOne(self, nombre= 'AM', descripcion= 'Gestor', nroFases=3):
        return self._getTargetClass()(nombre, descripcion, nroFases)

    def test_constructor(self):
        instance = self._makeOne()
        self.assertEqual(instance.nombre, 'AM')
        self.assertEqual(instance.descripcion, 'Gestor')
        self.assertEqual(instance.nroFases, 3)

class FaselTests(unittest.TestCase):

    def setUp(self):
        self.session = _initTestingDB()

    def tearDown(self):
        self.session.remove()

    def _getTargetClass(self):
        from alpha.modelos.models import Fase
        return Fase

    def _makeOne(self, nombre= 'analisis', nroItems= 3,posicionFase=1 ,descripcion= 'principio', nroLB=1, estado= 'inicial'):
        return self._getTargetClass()(nombre, nroItems, posicionFase,descripcion,nroLB,estado)

    def test_constructor(self):
        instance = self._makeOne()
        self.assertEqual(instance.nombre, 'analisis')
        self.assertEqual(instance.descripcion, 'principio')
        self.assertEqual(instance.nroItems, 3)
        self.assertEqual(instance.posicionFase, 1)
        self.assertEqual(instance.nroLB, 1)
        self.assertEqual(instance.estado, 'inicial')

class TipoItemlTests(unittest.TestCase):

    def setUp(self):
        self.session = _initTestingDB()

    def tearDown(self):
        self.session.remove()

    def _getTargetClass(self):
        from alpha.modelos.models import TipoItem
        return TipoItem

    def _makeOne(self, nombre= 'planilla'):
        return self._getTargetClass()(nombre)

    def test_constructor(self):
        instance = self._makeOne()
        self.assertEqual(instance.nombre, 'planilla')


class AssociationRollTests(unittest.TestCase):

    def setUp(self):
        self.session = _initTestingDB()

    def tearDown(self):
        self.session.remove()

    def _getTargetClass(self):
        from alpha.modelos.models import AssociationRol
        return AssociationRol

    def _makeOne(self):
        return self._getTargetClass()()

    def test_constructor(self):
        instance = self._makeOne()

class AssociationlTests(unittest.TestCase):

    def setUp(self):
        self.session = _initTestingDB()

    def tearDown(self):
        self.session.remove()

    def _getTargetClass(self):
        from alpha.modelos.models import Association
        return Association

    def _makeOne(self):
        return self._getTargetClass()()

    def test_constructor(self):
        instance = self._makeOne()
